﻿#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common;

$URL       = "https://www.example.com/w/signup.php";
$UA        = LWP::UserAgent->new();
$myCookies = HTTP::Cookies->new(
    file           => "cookies.txt",
    autosave       => 1,
    ignore_discard => 1,
);
$UA->cookie_jar( $myCookies );

# Wyszukanie określonego pliku cookie w podanej domenie. Skrypt wykorzystuje zewnętrzną przestrzeń nazw ($find::)
# do uzyskania klucza, ścieżki i przeszukiwanej domeny.
# Znaleziony plik cookie jest umieszczany w tablicy @find::cookie.
sub findCookie {
    my (
        $version,   $key,    $val,     $path,    $domain, $port,
        $path_spec, $secure, $expires, $discard, $rest
    ) = @_;

    if (    ( $domain eq $find::domain )
        and ( $path eq $find::path )
        and ( $key  eq $find::key ) )
    {
        print "$version, $key, $val, $path, $domain, $expires\n";
        @find::cookie = @_;
    }
}

# Spreparowany, złośliwy plik cookie: zawiera znany identyfikator sesji.
my $version = 0;
my $key     = "session_id";
my $val     = "1234567890abcdef";
my $path    = "/";
my $domain  = "example.com";
my $expires = "123412345";

# Dodanie złośliwego cookie do zbiorczego pliku. Pola, które nas nie interesują,
# są niezdefiniowane.
$myCookies->set_cookie(
    $version, $key,  $val,     $path, $domain, undef,
    undef,    undef, $expires, undef, undef
);

$req  = HTTP::Request->new( GET => $URL );
$UA->prepare_request($req);
$resp = $UA->request($req);

$find::domain = "example.com";
$find::path   = "/";
$find::key    = "session_id";

# Sprawdzenie, czy istnieją pliki cookie dla podanego serwisu, ścieżki i klucza.
$myCookies->scan( \&findCookie );
if (    ( $domain eq $find::cookie[4] )
    and ( $path   eq $find::cookie[3] )
    and ( $key    eq $find::cookie[1] ) )
{
    # Znaleziono pasujący plik cookie. Sprawdzenie, czy zawiera naszą wartość.
    if ( $val eq $find::cookie[2] ) {
        print "Test nie powiódł się: serwer zwrócił taki sam plik cookie, jaki został 
        przesłany.\n";
    } else {
        print "Test zakończony sukcesem: serwer zwrócił nowy plik cookie.\n";
    }
} else {
    print "Błąd skryptu testującego: brak właściwego pliku cookie.\n";
}
